home *** CD-ROM | disk | FTP | other *** search
/ ASME's Mechanical Engine…ing Toolkit 1997 December / ASME's Mechanical Engineering Toolkit 1997 December.iso / c_lang / varinc.lzh / MATCH.C < prev    next >
Encoding:
C/C++ Source or Header  |  1979-11-30  |  4.9 KB  |  99 lines

  1. /* SOURCE FILE: MATCH.C */
  2. /*****************************************************************************/
  3. /* match() verifies a data string, character by character, against a match   */
  4. /*   string. If the match string is shorter than the data string, the        */
  5. /*   last match-string character is used to verify the data string.          */
  6. /*   The match string may be composed of these match characters:             */
  7. /*                                                                           */
  8. /*      A   A-Z                             (uppercase letters)              */
  9. /*      #   0-9 only                        (numbers)                        */
  10. /*      S   0-9 or + or -                   (signs or numbers)               */
  11. /*      F   0-9 or .                        (floating-point numbers)         */
  12. /*      L   a-z, A-Z, 0-9 or ;:.,/?*-$#()'! (names, addresses)               */
  13. /*             and non-leading spaces                                        */
  14. /*      U   A-Z, 0-9 or ;:.,/?*-$#()'!      (uppercase names, addresses)     */
  15. /*             and non-leading spaces                                        */
  16. /*      P   0-9 or - or () or space         (phone numbers)                  */
  17. /*      Q   one of "Yy1Nn0"                 (question reply)                 */
  18. /*      X   any printable character         (text)                           */
  19. /*                                                                           */
  20. /*    Any other character in the match string is ignored. Spaces are matched */
  21. /*    by L, U, and P. Empty match string matches any data.                   */
  22. /* Return value: YES = data string matches; NO = no match.                   */
  23. /*****************************************************************************/
  24.  
  25. #include <stddefs.h>
  26. #include <ctype.h>           /* for isxxx() character-type macro definitions */
  27.  
  28. flag match(data_str, match_str)
  29. char data_str[];                             /* source string to be verified */
  30. char match_str[];                               /* match characters to match */
  31.    {
  32.    short ichar;                                   /* input character counter */
  33.    char c_data;                                  /* character of data string */
  34.    char c_match;                                /* character of match string */
  35.  
  36.    /* Initialize a variable to a function return. */
  37.    short len_match = strlen(match_str);  
  38.    bflag matches = YES;
  39.  
  40.    for (ichar = 0; data_str[ichar] != '\0' && matches; ++ichar)
  41.       {
  42.  
  43.       /* Determine match character. */
  44.       if (ichar < len_match)                    /* Use next match character. */
  45.          c_match = match_str[ichar];
  46.       else if (len_match == 0)                             /* null match_str */
  47.          c_match = '\0';
  48.       else                            /* Use last character of match string. */
  49.          c_match = match_str[len_match - 1];
  50.       c_data = data_str[ichar];
  51.       switch (c_match)                             /* Check match with data. */
  52.          {
  53.          case 'A':                                                    /* A-Z */
  54.             if (!isupper(c_data))
  55.                matches = NO;
  56.             break;
  57.          case '#':                                               /* 0-9 only */
  58.             if (!isdigit(c_data))
  59.                matches = NO;
  60.             break;
  61.          case 'S':                                     /* 0-9 or + or - only */
  62.             if (!isdigit(c_data) && !strchr("+-", c_data))
  63.                matches = NO;
  64.             break;
  65.          case 'L':               /* a-z, A-Z, 0-9 or ;:.,/?*-$#()'! or space */
  66.             if (!isalnum(c_data) && !strchr(";:.,/?*-$#()'! ",
  67.                c_data))
  68.                matches = NO;   
  69.             if (ichar == 0 && c_data == ' ')            /* no leading blanks */
  70.                matches = NO;
  71.             break;
  72.          case 'U':                    /* A-Z, 0-9 or ;:.,/?*-$#()'! or space */
  73.             if (!isupper(c_data) && !isdigit(c_data) &&
  74.                !strchr(";:.,/?*-$#()'! ", c_data))
  75.                matches = NO;
  76.             if (ichar == 0 && c_data == ' ')            /* no leading blanks */
  77.                matches = NO;
  78.             break;
  79.          case 'P':                                /* 0-9 or - or () or space */
  80.             if (!isdigit(c_data) && !strchr("-() ", c_data))
  81.                matches = NO;
  82.             break;
  83.          case 'F':                                               /* 0-9 or . */
  84.             if (!isdigit(c_data) && !strchr(".", c_data))
  85.                matches = NO;
  86.             break;
  87.          case 'Q':                     /* Yy1Nn0 as reply to yes/no question */
  88.             if (!strchr("Yy1Nn0", c_data))
  89.                matches = NO;
  90.             break;
  91.          case 'X':                           /* Must be printable (' '-'~'). */
  92.             if (!isprint(c_data))
  93.                matches = NO;
  94.             break;
  95.          }
  96.       }
  97.    return (matches);
  98.    }  
  99.